import axios from 'axios'
import { router } from '@/router'
import appConfig from '@/config/config'
import { aesEncrypt, aesDecrypt } from '@/utils/aesCrypto'

const request = axios.create({
  baseURL: appConfig.api_base_url,
  timeout: 60000,
})

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 配置请求头
    if (localStorage.getItem('token')) {
      config.headers.Authorization = localStorage.getItem('token') || ''
    }
    // 如果是post请求，则对数据进行加密
    if (config.method === 'post' && config.data && !(config.data instanceof FormData)) {
      config.data = aesEncrypt(JSON.stringify(config.data), appConfig.aes_key)
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  },
)

// 响应拦截器
request.interceptors.response.use(
  (res) => {
    // 解密响应数据
    res.data = JSON.parse(aesDecrypt(res.data, appConfig.aes_key))
    // 响应数据处理
    if (res.data.code === 401) {
      ElMessageBox.confirm(`${res.data.msg}，请重新登录`, '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
        .then(() => {
          localStorage.removeItem('token')
          router.push('/login')
        })
        .catch(() => {})
    } else if (res.data.code !== 200) {
      ElMessage({
        message: res.data.msg,
        grouping: true,
        type: 'error',
      })
    }
    return res
  },
  (error) => {
    if (error.code === 'ECONNABORTED') {
      // 超时错误
      ElMessage.error('请求超时，请稍后重试')
    } else if (!error.response) {
      // 网络错误（比如断网、DNS 无响应等）
      ElMessage.error('网络错误，请检查您的网络连接')
    } else {
      // 其他响应错误
      ElMessage.error(`${error.response.status}: ${error.response.data.error || '请求失败'}`)
    }
    return Promise.reject(error)
  },
)

export default request
